與前端合作開發的過程,會發現錯誤響應的設計也是非常重要的,不僅能讓後端開發者快速了解問題,也能讓前端人員更好理解處理。在Spring Framework有提供相關功能,Spring Boot則是進行簡化與增強,使用適當的HTTP狀態碼能更清楚表現不同的錯誤狀況。
Http狀態碼是標準Http協議其中一部分,任何web框架都能使用狀態碼表達請求的成功或失敗。
Http常見的狀態碼如下,選擇適當的狀態碼,能夠讓API了解使用操作發生的錯誤情況為何,有利於後續對不同的錯誤提供不同的情境處理。
Spring、Spring Boot可以透過以下註解指定HTTP狀態碼,也能使用自定義Exception Handler統一處理錯誤,返回對應的HTTP狀態碼。
@ResponseStatus(HttpStatus.BAD_REQUEST) // Spring自動返回400 Bad Request狀態碼
public class BadRequestException extends RuntimeException {
public BadRequestException(String message) {
super(message);
}
}
這兩個註解是Spring Framework核心功能,而Spring Boot進一步簡化,使用上更方便:
@ControllerAdvice // 定義全局異常處理器
public class GlobalExceptionHandler {
@ExceptionHandler(BadRequestException.class) // 針對特定例外類型處理
public ResponseEntity<Object> handleBadRequest(BadRequestException ex) { // 建構響應體,指定狀態碼
Map<String, Object> body = new HashMap<>();
body.put("error", "Bad Request");
body.put("message", ex.getMessage());
return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
}
}
也是透過Spring功能,並使用Spring Boot的ResponseEntity自定義:
public class ApiError {
private String status;
private String message;
private List<String> errors;
}
@ExceptionHandler(BadRequestException.class)
public ResponseEntity<ApiError> handleBadRequest(BadRequestException ex) {
List<String> errors = Arrays.asList(ex.getMessage());
ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST.toString(), "Invalid Error", errors);
return new ResponseEntity<>(apiError, HttpStatus.BAD_REQUEST);
}
可以讓返回的錯誤訊息格式統一,前端能更好解析錯誤訊息。
綜合上述,良好的錯誤響應對於前端或後端人員都能更好開發,提升使用體驗,利用Spring Boot更能靈活自定義處理錯誤,並使用HTTP狀態來精準表達錯誤。